/*************************************************************************************
 * Nombre del archivo: Main.java
 * Universidad del Valle de Guatemala
 * Curso: Diseño de Lenguajes de Programación
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Abril de 2010
 * Descripción: Segundo proyecto. Generador de analizador léxico
*************************************************************************************/

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Main {

    private static Scanner scan = new Scanner(System.in);

    private static int hacer;
    private static int opciones_del_menu = 0;
    private static GeneratedScanner scanner;
    private static boolean debug = false;

    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {
        //ciclo para repetir hasta que quiera salir del programa
        do
        {
	    System.out.println("\n**************************************************************");
            System.out.println(" ____  ____  ____  ____  ____  ____ ");
            System.out.println("||D ||||o ||||u ||||b ||||l ||||e ||");
            System.out.println("||__||||__||||__||||__||||__||||__||");
            System.out.println("|/__\\||/__\\||/__\\||/__\\||/__\\||/__\\|");

            System.out.println("\n**************************************************************");
            Menu();
        } while (hacer!=opciones_del_menu);//hasta que precione salir
        System.out.println("\n¡Gracias por utilizar el programa!");
    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {

            opciones_del_menu=0;

            System.out.println("\n\t******** Menu Principal ********\n");
            System.out.println((++opciones_del_menu)+"- Ingresar archivo de entrada");
	    System.out.println((++opciones_del_menu)+"- Ingresar cadena de entrada");
	    System.out.println((++opciones_del_menu)+"- Scan");
            System.out.println((++opciones_del_menu)+"- Salir del Programa");
            System.out.print("\t >> ¿Qué desea hacer?\tMarque el número: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>opciones_del_menu) &&(hacer!=-1))
                System.out.println("¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>opciones_del_menu);
        System.out.println("\n*************************************************************\n");

        // ========= para realizar la accion marcada arriba =============================================
	String lines = "";
        switch (hacer)
        {
            case 1://  ********* 1- Ingresar archivo de entrada *****************************************

                lines = Obtener_Archivo();
                // --------------------------------------
                // imprimir archivo
                //System.out.println("Archivo:\n"+lines);
                // --------------------------------------
                if(lines.isEmpty()==false){
                    // --------------------------------------
                    scanner = new GeneratedScanner(lines);
                    Parser parser = new Parser();
                    parser.Parse(scanner);
                    // --------------------------------------
                }

                break;
                //***************************************************************************************
	     case 2://  ********* 2- Ingresar cadena de entrada *****************************************
		
		System.out.print("Ingrese la cadena de entrada: ");
                lines = scan.nextLine();
		System.out.println("\n");
                // --------------------------------------
                // imprimir archivo
                //System.out.println("Archivo:\n"+lines);
                // --------------------------------------
                if(lines.isEmpty()==false){
                    // --------------------------------------
                    scanner = new GeneratedScanner(lines);
                    Parser parser = new Parser();
                    parser.Parse(scanner);
                    // --------------------------------------
                }

                break;
                //***************************************************************************************
		case 3://  ********* 3- Scan *****************************************
		
		System.out.println("Tokens encontrados: "+scanner.tokens_encontrados.toString());
		System.out.println(scanner.Scan().toString());

                break;
                //***************************************************************************************
        }
        // ==============================================================================================
    }

    /***********************************************
     * Método: Obtener_Archivo
     * Uso: Obtiene el contenido de un archivo
     *      seleccionado desde dentro del método
     * @return LinkedList<String>
    ***********************************************/
    private static String Obtener_Archivo() {

        LinkedList<String> arch = new LinkedList<String>();
        //----------------------------------------------------------------------

        File file;

        JFileChooser chooser = new JFileChooser("/home/martin/Desktop");
        int status = chooser.showOpenDialog(null);
        if(status !=JFileChooser.APPROVE_OPTION){
            System.out.println("\tNo se seleccionó ningún archivo");
            return "";
        }
        //----------------------------------------------------------------------
        file = chooser.getSelectedFile();

        Scanner scan_file;

        try {
            scan_file = new Scanner(file);
             while(scan_file.hasNext()){
                arch.add(scan_file.nextLine());
            }
        } catch (Exception ex) {
            System.out.println("\tEl archivo no se pudo abrir");
        }
        //----------------------------------------------------------------------
        // -------- borrar las líneas vacías -----------------------------------
	/*
        for(int i=0;i<arch.size();i++){
            if(Pattern.matches("\\s", arch.get(i)) | Pattern.matches("", arch.get(i))){
                arch.remove(i--);
            }
        }
	*/
        //----------------------------------------------------------------------
        String retorno = "";
        retorno+=arch.getFirst();

        for(int i=1;i<arch.size();i++){
            retorno+="\n"+arch.get(i);
        }
        return retorno;
    }

}
